// 六、ES6 中的类(下)

// 1.继承
// es5
function Food() {
  this.type = 'food';
}
Food.prototype.getType = function () {
  return this.type;
};
function Vegetables(name) {
  this.name = name;
}
Vegetables.prototype = new Food();
const tomato = new Vegetables('tomato');
// console.log(tomato.getType());
// es6
// class Parent {
//   constructor(name) {
//     this.name = name;
//   }
//   getName() {
//     return this.name;
//   }
//   static getName2() {
//     return this.name;
//   }
// }
// class Child extends Parent {
//   constructor(name, age) {
//     super(name);
//     // 只有调用了super方法之后，才能在子类的构造函数中使用this
//     this.age = age;
//   }
// }
// const c = new Child('lp', 18);
//   console.log(c);
//   console.log(c.getName());
// console.log(c instanceof Child);
// console.log(c instanceof Parent);
// console.log(Child.getName2());

// 2.Object.getPrototypeOf

// console.log(Object.getPrototypeOf(Child) === Parent);

// 3.super

// 作为函数

// 作为对象
// 在普通方法中，指向父类的原型对象
// 在静态方法中，指向父类

// 父类的原型上的方法中this指向子类的实例
class Parent {
  constructor() {
    this.name = 'parent';
  }
  print() {
    console.log(this.name);
  }
}
class Child extends Parent{
  constructor() {
    super();
    this.name = 'child';
  }
  childPrint() {
    super.print();
  }
}
const c = new Child();
c.childPrint();

// 4.类的prototype属性和__proto__属性

// es5
var objs = new Object()
console.log(objs.__proto__ == Object.prototype);

// es6
// 子类的__proto__指向父类本身
// 子类的prototype的属性的__proto__指向父类的prototype属性
// 实例的__proto__属性的__proto__指向父类实例的__proto__

// es6如何继承原生构造函数
// Boolean
// Number
// String
// Array
// Date
// Function
// RegExp
// Error
// Object

class CustomArray extends Array{
  constructor(...args){
    super(...args)
  }
}
const arr = new CustomArray(3,4,5)
// console.log(arr.fill('1'));
console.log(arr.join('-'));


